import eslint from '@eslint/js'
import tsEslint from 'typescript-eslint'
import eslintPluginVue from 'eslint-plugin-vue'
import stylistic from '@stylistic/eslint-plugin'
import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended'
import sortKeysCustomLevel from 'eslint-plugin-sort-keys-custom-level'

/**
 * ESLint + prettier 配置
 * 需要安装的包：
 *
 *  "@eslint/js": "^9.36.0",
 *  "@stylistic/eslint-plugin": "^5.4.0",
 *  "eslint": "^9.36.0",
 *  "eslint-config-prettier": "^10.1.8",
 *  "eslint-plugin-prettier": "^5.5.4",
 *  "eslint-plugin-vue": "^10.5.0",
 *  "eslint-plugin-sort-keys-custom-level": "^1.0.1",
 *  "prettier": "^3.6.2",
 *  "typescript": "^5.9.2",
 *  "typescript-eslint": "^8.44.1",
 */
export default [
  { ignores: ['node_modules', 'dist'] },
  /** JS 推荐配置 */
  eslint.configs.recommended,
  /** TS 推荐配置 */
  ...tsEslint.configs.recommended,
  /** Vue 推荐配置 */
  ...eslintPluginVue.configs['flat/recommended'],
  /** Stylistic 自定义规则 */
  stylistic.configs.customize({ indent: 2, quotes: 'single', semi: false, jsx: true, braceStyle: '1tbs', arrowParens: 'always' }),
  /**
   * JavaScript 规则
   */
  {
    rules: {
      // 'no-console': 'error',
    },
  },
  /**
   * Vue 规则
   */
  {
    files: ['**/*.vue'],
    languageOptions: {
      parserOptions: {
        /** TypeScript 项目需要用到这个 */
        parser: tsEslint.parser,
        ecmaVersion: 'latest',
        /** 允许在 .vue 文件中使用 JSX */
        ecmaFeatures: { jsx: true },
        sourceType: 'module',
      },
    },
    rules: {
      // 在这里追加 Vue 规则
      'vue/no-mutating-props': ['error', { shallowOnly: true }],
    },
  },
  /**
   * TypeScript 规则
   */
  {
    files: ['**/*.{ts,tsx,vue}'],
    rules: {
      // ...在这里追加 TypeScript 规则

      // 开启console
      '@typescript-eslint/no-explicit-any': 'off',
      'no-undef': 'off',
    },
  },
  /**
   * 对象键排序规则
   */
  {
    files: ['**/*.{ts,tsx,vue}'],
    plugins: { 'sort-keys-custom-level': sortKeysCustomLevel },
    rules: {
      'sort-keys-custom-level/sort-keys': [
        'error',
        'asc',
        {
          customTarget: [
            {
              targetKeys: ['AvueOption'], // 指定需要排序的对象
              subLevels: [2], // 指定需要排序的对象的第几层需要排序
              fieldsOrder: [
                // 自定义字段顺序、注意：最下面的在顺序最上面
                'ellipsis',
                'append',
                'prefix',
                'options',
                'uploadType',
                'dicData',
                'tag',
                'clickEdit',
                'clickKey',
                'click',
                'search',
                'merge',
                'mock',
                'span',
                'rules',
                'showProp',
                'type',
                'prop',
                'label',
              ],
            },
          ],
        },
      ],
    },
  },
  /**
   * Prettier 配置
   * 会合并根目录下的 prettier.config.js 文件
   * @see https://prettier.io/docs/en/options
   */
  eslintPluginPrettierRecommended,
]
